﻿#ifndef QTGNUBARCODE_H
#define QTGNUBARCODE_H

/**
 * @file QlyGNUBarcode.h
 * @author LiYuan
 * @email 18069211@qq.com
 * @version v1.0
 * @license GPL2.0
 * @brief GNU Barcode 库的一个简单封装，用于在 Qt 程序中生成条形码。
 * @details 因为用到了 QPainter 和 QImage， 所以需要 QtGui 模块。
 *          可用于 Qt4 和 Qt5 代码中。Qt6 还没有测试。
 * @copyright 2015-2021
 */

#include <QImage>
#include <QPainter>

#include "barcode.h"

/**
 * @brief The QlyGNUBarcode class 对 GNU Barcode 库的一个封装。
 * TODO: 应该增加对输入数据的合法性验证，比如 EAN 只能是数字，应该设置对应的错误码。根据错误码就能知道是什么错误。
 */
class QlyGNUBarcode
{
public:
    QlyGNUBarcode();
    ~QlyGNUBarcode() {if( bc ) Barcode_Delete(bc);}

    /**
     * @brief encodeText 对文字进行编码。
     * @param text
     * @return
     */
    bool encodeText(const QString & text);

    /**
     * @brief setBarcodeType 设置条码的类型。条形码类型很多，如果不设置则选择能编码数据的第一种条码类型。
     * @param barcode_type BARCODE_EAN 等，具体参照 barcode.h
     */
    void setBarcodeType(int barcode_type) {m_barcode_type = barcode_type;}

    /**
     * @brief setMargin 条码四周留白区域的大小。
     * @param whitespace
     */
    void setMargin(int whitespace);

    /**
     * @brief setNO_ASCII 设置是否在条码上/下面显示对应文字
     * @param on
     */
    void setNO_ASCII(bool on) {m_NO_ASCII = on;}

    QImage paintImage(double width_scale = 2, int height = 60, QImage::Format format = QImage::Format_RGB32);
    QImage paintImage(QSize size, QImage::Format format = QImage::Format_RGB32);
    bool render(QPainter &painter);
    bool render(QPainter &painter, QRect rect);

    /**
     * @brief minSize 返回条码的尺寸，不包括四周的 margin。
     * @return
     */
    QSize minSize();

    /**
     * @brief size 返回条码的尺寸，包括四周的 margin。
     * @return
     */
    QSize size() {return QSize(m_global_width, m_global_height);}

    /**
     * @brief foregroundColor 返回条码的前景色。
     * @return
     */
    QColor foregroundColor() const;
    void setForegroundColor(const QColor & fgColor);

    /**
     * @brief backgroundColor 返回条码的背景色。
     * @return
     */
    QColor backgroundColor() const;
    void setBackgroundColor(const QColor & bgColor);


private:
    bool updateSizeInfo();
    bool drawBar(QPainter &painter);
    bool drawText(QPainter &painter);

    Barcode_Item * bc;

    int m_barcode_type;
    bool m_NO_ASCII;

    int m_minWidth;
    int m_minHeight;
    int m_margin;
    int m_global_width; // 整体的宽度，包含 margin
    int m_global_height; // 整体的高度，包含 margin

    QString m_text;
    QColor m_fgColor;
    QColor m_bgColor;
};

#endif // QTGNUBARCODE_H
